#include "dlinklist.h"

/* 初始化链表，即置双链表头的指针为自己 */
void initList(Node *pHead)
{
	pHead->next = pHead;
	pHead->prev = pHead;
}

/*设置节点的数据域*/
int setListElem(Node *pNode, elemType element)
{
	if (pNode == NULL)
	{
		DLLIST_DEBUG("节点不存在\n");
		return -1;
	}
	pNode->element = element;
	return 0;
}

//创建新节点
Node *createListNode(elemType element)
{
	Node *p1 = (Node *)malloc(sizeof(Node)); //申请新节点
	if (p1 != NULL)
	{
		p1->element = element;
	}
	return p1;
}

/* 从链表头插入一个节点*/
int insertList(Node *pHead, Node *pNode)
{
	if (pHead == NULL)
	{
		DLLIST_DEBUG("链表头不存在\n");
		return -1;
	}

	pNode->next = pHead->next; //新节点的下一节点为头节点的下一节点
	pNode->prev = pHead;	   //新节点的上一节点为头节点

	pHead->next->prev = pNode; //头点的下一节点的上一节点为新节点
	pHead->next = pNode;	   //头节点的下一节点为新节点

	return 0;
}

/* 从链表头尾插入一个节点*/
int insertListTail(Node *pHead, Node *pNode)
{
	if (pHead == NULL)
	{
		DLLIST_DEBUG("链表头不存在\n");
		return -1;
	}

	pNode->next = pHead;	   //新节点的下一节点为头节点
	pNode->prev = pHead->prev; //新节点的上一节点为尾节点

	pHead->prev->next = pNode; //尾节点的下一节点为新节点
	pHead->prev = pNode;	   //头节点的上一节点为新节点

	return 0;
}

/* 删除一个节点*/
int deleteList(Node *pNode)
{
	if (pNode == NULL)
	{
		DLLIST_DEBUG("节点不存在\n");
		return -1;
	}

	pNode->next->prev = pNode->prev;
	pNode->prev->next = pNode->next;

	free(pNode);

	return 0;
}

/* 清除线性表L中的所有元素，即释放双链表L中所有的结点 */
int clearList(Node *pHead)
{
	Node *p1;

	if (pHead == NULL)
	{
		DLLIST_DEBUG("链表头不存在\n");
		return -1;
	}

	p1 = pHead->next; //从表头开始

	while (p1 != pHead)
	{
		p1 = p1->next; //保存下一结点的指针
		free(p1->prev);
	}

	free(pHead); //删除表头

	return 0;
}

/* 返回双链表的长度 */
int sizeList(Node *pHead)
{
	int size = 0;
	Node *p1; //

	if (pHead == NULL)
	{
		DLLIST_DEBUG("链表头不存在\n");
		return -1;
	}

	p1 = pHead->next;
	size++;

	while (pHead != p1)
	{
		size++; //遍历链表size大小
		p1 = p1->next;
	}

	DLLIST_DEBUG("sizeList函数执行，链表长度 %d \n", size);
	return size; //链表的实际长度
}

/* 返回双链表中数据域为element的元素，若没有怎么返回NULL */
Node *findListElem(Node *pHead, elemType element)
{
	Node *p1;

	if (pHead == NULL)
	{
		DLLIST_DEBUG("链表头不存在\n");
		return NULL;
	}

	if (pHead->element == element)
		return pHead;

	p1 = pHead->next;

	while (pHead != p1) //遍历链表size大小
	{
		if (p1->element == element)
			return p1;
		p1 = p1->next;
	}
	return NULL;
}

/* 打印链表*/
void printList(Node *pHead)
{
	Node *p1;

	if (pHead == NULL)
	{
		DLLIST_DEBUG("链表头不存在\n");
		return;
	}

	p1 = pHead->next;
	printf("element : %d\t", pHead->element);

	while (pHead != p1) //遍历链表size大小
	{
		printf("%d\t", p1->element);
		p1 = p1->next;
	}

	printf("\n");
}
